package com.gitee.feizns.dynamic.concurrent;

import java.time.Duration;

/**
 * 记者
 * @author feizns
 * @since 2025/5/8
 */
public interface Task<T> extends TaskStatus {

    /**
     * 完成
     * @param value 值
     */
    boolean complete(T value);

    /**
     * 完成
     * @param value 值
     */
    default boolean resolve(T value) {
        return complete(value);
    }

    /**
     * 完成
     * @param ex 异常
     */
    boolean reject(Throwable ex);

    /**
     * 取消
     * @return boolean
     */
    boolean cancel(boolean mayInterruptIfRunning);

    /**
     * 取消
     * @return boolean
     */
    default boolean cancel() {
        return cancel(true);
    }

    /**
     * 等待并获取
     * @return {@link T }
     */
    default T await() {
        return join();
    }

    /**
     * 等待并获取
     * @return {@link T }
     */
    T join();

    /**
     * 等待并获取
     * @return {@link T }
     */
    T get();

    /**
     * 获取
     * @return {@link T }
     */
    T get(Duration duration);

    /**
     * 获取
     * @param valueIfAbsent 值如果缺席
     * @return {@link T }
     */
    T getNow(T valueIfAbsent);

}
